#ifndef DEFINES_H
#define DEFINES_H

#include <arpa/inet.h>
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <iostream>
#include <math.h>
#include <netdb.h>
#include <netinet/in.h>
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
#include <signal.h>
#include <time.h>
#include <unistd.h>
#include <X11/Xlib.h>

#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_thread.h>

// Defines servidor
#define SRV_CFG_ARCH "../config/server_cfg"
#define RECV 640
#define SEND 650
#define CONF 660
#define INICIO 670
#define NUEVO_CONTRINCANTE 680
#define HOST "127.0.0.1"

// Defines cliente
#define CLI_CFG_ARCH "../config/client_cfg"
#define ESFERA 30									// Jugador
#define ESFERA_SELEC 31
#define CUBO 40										// Contrincante
#define CUBO_SELEC 41			
#define CAMBIO 10									// Movimiento de pieza
#define ADD 11										// Adición de pieza

// Defines SDL
#define WIDTH 600
#define HEIGHT 600
#define BPP 24
#define GRID_POSX 120
#define GRID_POSY 125
#define ANCHO_ITEM 100
#define GRID_SIZE 360


// Defines movimientos
#define AGREGAR 300
#define MOVER 0
#define MOVER_CONF 2
#define VALIDO 1
#define INVALIDO -1
#define ACK -3

// Defines estados
#define PERDEDOR_RONDA -2
#define PERDEDOR -1
#define NO_TERMINO 0
#define GANADOR 1
#define GANADOR_RONDA 2
#define CAMPEON 3

////////// Typedefs //////////

// Matrices y vectores propios del juego
typedef struct 
{	
	short int matriz[3][3];
	char nombre[30]; 
}t_scr;

// Estructura para crear hilos de cliente
typedef struct
{
	int socket1;
	int socket2;
}s_sockets;

// Estructuras para configuración
typedef struct
{
	int puerto;							// Puerto
	int cant_partidas;
}sv_config;

typedef struct
{
	int puerto;							// Puerto
	char ip_srv[30];				// IP Server
}cl_config;

// Comunicación entre cliente y servidor partida
typedef struct
{
	// 1: ganador_partida, -1: perdedor_partida, 0: nada, 
	// 2: ganador_ronda, -2: perdedor ronda
	// 3: campeon de torneo
	short int estado;
	
	// 1-2: válida, -1: inválida, 0: mover
	short int accion;
	
	// 1-9: posición matriz, 0: sin actualizaciones
	short int posicion;
	
	// 1-9: nueva posición (se movió ficha)
	short int n_posicion;
}s_mov;

#endif
